<?php
/**
 * Сессии
 * 
 * Класс для работы с сессиями
 * @author Anton Zavidov
 * @package myLiveShop
 */

/**
 * Базовый класс для работы с сессиями
 *
 */
abstract class Session extends Base{
	/**
	 * ID текущей сессии
	 *
	 * @var string
	 */
	protected $id=null;
	/**
	 * Имя текущей сессии
	 *
	 * @var string
	 */
	protected $session_name;
	/**
	 * Универсальная функция работы с сессией
	 *
	 * @param string $name имя переменной
	 * @param mixed $value значение переменной
	 */
	public static function _($name, $value=null){
		if(!isset($_SESSION)){
			Core::getSession();
			session_start();
		}
		if($value===null){
			if(isset($_SESSION[$name]))
				return $_SESSION[$name];
			else return null;
		}else{
			$_SESSION[$name]=$value;
			return $value;
		}
	}
	/**
	 * Удаляет переменную из сесии
	 *
	 * @param string $name имя переменной
	 * @return mixed значение переменной до удаления
	 */
	public static function u($name){
		if(!isset($_SESSION))session_start();
		if(!isset($_SESSION[$name]))return null;
		$value=$_SESSION[$name];
		unset($_SESSION[$name]);
		return $value;
	}
	/**
	 * Конструктор
	 *
	 */
	public function __construct($className=null){
		$this->session_name=ini_get('session.name');
		session_set_save_handler (array($this,"open"), array($this,"close"), array($this,"read"), array($this,"write"), array($this,"destroy"), array($this,"gc"));
		parent::__construct($className?$className:__CLASS__);
	}
	/**
	 * Открываем сессию
	 *
	 * @param string $save_path
	 * @param string $session_name
	 */
	abstract public function open($save_path=null, $session_name=null);
	/**
	 * Закрываем сессию
	 *
	 */
	abstract public function close();
	/**
	 * Читаем данные
	 *
	 * @param string $id имя переменной
	 * @return mixed
	 */
	abstract public function read($id);
	/**
	 * Записываем данные
	 *
	 * @param string $id имя переменной
	 * @param string $sess_data данные
	 */
	abstract public function write($id, $sess_data);
	/**
	 * Удаляем данные
	 *
	 * @param string $id имя переменной
	 */
	abstract public function destroy($id);
	/**
	 * Очищаем просроченные сессии
	 *
	 * @param int $maxlifetime время жизни сессии
	 */
	abstract public function gc($maxlifetime);
	/**
	 * Возвращает true если сессия запущена
	 * 
	 * @return boolean
	 */
	public function isStart(){
		return isset($_SESSION);
	}
	/**
	 * получаем идентификатор сесии
	 *
	 * @return string
	 */
	public function getId(){
		if($this->id){
			return $this->id;
		}
		//пытаемся найти ИД в запросе
		if (isset($_REQUEST[$this->session_name])){
			$this->id=$_REQUEST[$this->session_name];
		//пытаемся найти в куках
		}elseif(isset($_COOKIE[$this->session_name])){
			$this->id=$_COOKIE[$this->session_name];
		}else{
			//если сессия не запущенна запускаем её
			if(!$this->isStart()){
				$this->open(null,$this->session_name);
			}
			$this->id=session_id();
		}
		return $this->id;
	}
}